package main

import (
	"fmt"
	"github.com/pelletier/go-toml/v2"
	"os"
	"path/filepath"
	"regexp"
)

// ServerConfig 服务器配置，用于定义服务器可配置项
type ServerConfig struct {
	Port int `toml:"port"`
	// 启动时是否检查是否开机自启
	CheckStartupScript bool `toml:"check_startup_script"`
	// 是否允许重定向
	FollowRedirects bool `toml:"follow_redirects"`
	// 最大重定向次数
	MaxRedirects int `toml:"max_redirects"`
}

// ProxyConfig 代理配置，用于定义代理可配置项
type ProxyConfig struct {
	// 是否启用全局Http代理
	EnableProxy bool `toml:"enable_proxy"`
	// 代理服务器地址
	ProxyUrl string `toml:"proxy_url"`
	// 代理服务器用户名
	ProxyUrlUsername string `toml:"proxy_url_username"`
	// 代理服务器密码
	ProxyUrlPassword string `toml:"proxy_url_password"`
}

// LogConfig 日志配置，用于定义日志可配置项
type LogConfig struct {
	// 日志输出级别
	LogLevel string `toml:"log_level"`
	// 日志文件保存路径
	LogSavePath string `toml:"log_save_path"`
	// 日志保留天数
	MaxDays int `toml:"max_days"`
}

// Config 配置文件结构体
type Config struct {
	// 服务器配置
	ServerConfig ServerConfig `toml:"server"`
	// 代理配置
	ProxyConfig ProxyConfig `toml:"proxy"`
	// 日志配置
	LogConfig LogConfig `toml:"log"`

	// 路由规则
	Routes []Route `toml:"routes"`
}

// Route 修改配置项结构体，添加Rewrite字段支持正则表达式
type Route struct {
	// 路径前缀
	PathPrefix string `toml:"url_path_prefix"`
	// 重写规则，支持正则表达式路径重写
	Rewrite string `toml:"rewrite"`
	// 目标地址
	Target string `toml:"target"`
	// 正则表达式路径重写规则
	rewriteRegex *regexp.Regexp
}

// 加载服务器配置
func loadServerConfig(configPath string) (*Config, error) {
	if configPath == "" {
		configPath = "server_config.toml"
	}

	// 移除默认路径判断逻辑（已通过参数处理）
	absPath, err := filepath.Abs(configPath)
	if err != nil {
		return nil, fmt.Errorf("无法解析配置文件路径: %v", err)
	}

	// 读取配置文件
	serverFile, err := os.ReadFile(absPath)
	if err != nil {
		return nil, fmt.Errorf("读取配置文件失败: %v", err)
	}
	var serverConf struct {
		// 服务器配置
		ServerConfig ServerConfig `toml:"server"`
		// 代理配置
		ProxyConfig ProxyConfig `toml:"proxy"`
		// 日志配置
		LogConfig LogConfig `toml:"log"`
	}
	if err := toml.Unmarshal(serverFile, &serverConf); err != nil {
		return nil, fmt.Errorf("解析配置文件失败: %v", err)
	}

	return &Config{
		ServerConfig: serverConf.ServerConfig,
		ProxyConfig:  serverConf.ProxyConfig,
		LogConfig:    serverConf.LogConfig,
	}, nil
}

// 加载路由配置
func loadRoutes(routesPath string) ([]Route, error) {
	if routesPath == "" {
		routesPath = "routes_config.toml"
	}
	// 移除默认路径判断逻辑（已通过参数处理）
	absPath, err := filepath.Abs(routesPath)
	if err != nil {
		return nil, fmt.Errorf("无法解析路由配置文件路径: %v", err)
	}

	// 读取路由配置文件
	routesFile, err := os.ReadFile(absPath)
	if err != nil {
		return nil, err
	}
	var routesConf struct {
		Routes []Route `toml:"routes"`
	}
	if err := toml.Unmarshal(routesFile, &routesConf); err != nil {
		return nil, fmt.Errorf("解析路由配置文件失败: %v", err)
	}

	return routesConf.Routes, nil
}
